package Z代码随想录.数组;

// 螺旋矩阵
// n*n
public class Leetcode59 {

    // 本题的思路在于，要遵循一个循环不变量的原则，就是 左闭右开
    // 通过画图，我们可以知道 如果 n = 2 就是 2*2 矩阵，只要转一圈，所以 转圈数 等于 n/2
    // 如果 n 是奇数的时候，就会中间有个空，则补上就行
    public int[][] generateMatrix(int n) {
        int startx = 0;
        int starty = 0;
        int count = 1;
        int i = 0;
        int j = 0;
        int loop = n / 2;
        int offset = 1; // 初始偏移量为1
        int[][] array = new int[n][n];
        int mid = n / 2;
        while (loop != 0) {
            // 行不变，列在变
            for (j = starty; j < n - offset; j++) {
                array[startx][j] = count++;
            }

            // 列不变，行在变
            for (i = startx; i < n - offset; i++) {
                array[i][j] = count++;
            }

            // 行不变,列在变
            for (; j > starty; j--) {
                array[i][j] = count++;
            }

            // 列不变，行在变
            for (; i > startx; i--) {
                array[i][j] = count++;
            }
            // 一圈结束后
            startx++;
            starty++;
            offset = offset + 1;
            loop--;
        }
        // 此处考虑n为奇数的时候的状况
        if (n % 2 == 1) {
            array[mid][mid] = count;
        }
        return array;
    }

}
